import java.util.Scanner;
//给定一组长度为n的栅栏，从左到右高度依次是h[i]。需要对这个栅栏粉刷油漆，每次你可以粉刷一行或者一列。
//问最少粉刷几次，可以给所有栅栏上漆。(不能多刷)
//输入：
//第一行包含一个整数，表示栅栏的长度。
//接下来的一行，包含n个数(n<= 5000),依次表示h[i](0<= h[i]<= 10)。
//输出：
//输出一行表示对应的答案。。
//举例：
//Sample Input 5 22121
//Sample Output 3

    public class title1 {
        static int n;
        static int[] h = new int[5005];

        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            while (in.hasNext()) {
                n = in.nextInt();
                for (int i = 1; i <= n; i++) {
                    h[i] = in.nextInt();
                }
                System.out.println(cal(1, n));
            }
            in.close();
        }

        private static int cal(int l, int r) { //分治解决粉刷的问题
            int minn = 11;
            for (int i = l; i <= r; i++) {//找到最小值
                if (minn > h[i]) {
                    minn = h[i];
                }
            }
            int ans = minn;//最小值
            for (int i = l; i <= r; i++) {
                if (h[i] == minn) {
                    continue;
                }else {
                    int si = i + 1; //找到比最小值大的那个位置统计
                    while (si <= r && h[si] != minn) {
                        si++;//统计超过最小值的次数
                    }
                    si--;//指向最后的不等于最小值的位置
                    for (int j = i; j <= si; j++) {
                        h[j] -= minn;
                    }
                    ans += cal(i, si);//对当前的区间进行递归的操作
                    i = si; //更新区间值
                }
            }
            return Math.min(ans, r - l + 1); //操作的次数，或者是纵向竖着刷
        }
}
